#include "TCPServe.hpp"
#include "Protocol.hpp"
#include "NetCalculatec.hpp"
#include "Daemon.hpp"

int main(int argc,char*argv[])
{
    if(argc!=2)
    {
        LOG(FATAL)<<"请正确传参，例如: ./.exe port";
        exit(USAGE_ERR);
    }
    std::cout<<"服务器进程启动，是一个守护进程"<<std::endl;
    // Enable_Console_Sync_Strategy;
    Daemon();
    Enable_File_Log_Sync_Strategy;

    //守护进程或者精灵进程（具有独立会话）也是孤儿进程的一种
    //怎么做？调用系统调用

    //为什么OSI是7层，而TCP/IP是4层
    //因为应用层无法做到统一，不同的业务需要不同的实现逻辑
    //传输数据时的不确定性，需要我们自己定制协议来处理数据
    //服务器层需要执行的操作也是不确定的
    //总而言之，这三层如果也设计到内核中，不具有通用性，大部分业务的逻辑是需要自己处理的
    //应用层
    std::unique_ptr<NetCalculate> netcal=std::make_unique<NetCalculate>();

    //协议层
    std::unique_ptr<Protocol> protocol=std::make_unique<Protocol>([&netcal](Request& req){
        return netcal->Execute(req);
    });

    //建立连接，服务器层
    
    std::unique_ptr<TCPServe> tcpusvr = std::make_unique<TCPServe>(std::stoi(argv[1]),
                    [&protocol](std::shared_ptr<Socket>&sock,InetAddr&client){
                    protocol->GetRequest(sock,client);
    });
    tcpusvr->Start();
    return 0;
}